#函数function，是一块代码的集合，将代码块封装到函数中可以保证代码的整体性、复用性、可维护性
# #1、定义函数
# #def 函数名():
#     #函数的代码块
# def f1():
#     for x in range(1,9+1):
#         for y in range(1,x+1):
#             print(f'{y}x{x}={x*y}',end='\t')
#         print()
# #2、调用函数 函数名()
# f1()
# f1()
# f1()

#3、函数必须先定义，再调用
# f1()            #NameError: name 'f1' is not defined
# def f1():
#     print('111')

# #4、函数不调用，默认不执行
# def f1():
#     print('111')

#5.1、函数的形参与实参
# def f1(a,b):            #a和b都是函数f1的参数，定义函数时括号中写的参数是形式参数，它没有实际值
#     print(f'a={a},b={b}')
#
# f1(5,8)                 #调用函数时括号中写的参数是实际参数，它必须有实际值
# f1('小明','小强')         #在调用函数过程中，会将实参传递到形参中

#5.2、位置参数
    #实参的数量，必须与形参保持一致，不能多，也不能少
    #实参的位置，必须与形参保持一致
def f1(a,b):
    print(f'a={a},b={b}')

# f1(5)           #TypeError: f1() missing 1 required positional argument: 'b'
# f1(5,8,9)       #TypeError: f1() takes 2 positional arguments but 3 were given
f1('bbb','aaa')

#5.3、关键字参数
# def f1(a,b):
#     print(f'a={a},b={b}')
# f1('bbb','aaa')
# f1(b='bbb',a='aaa')     #在传递实参时，利用形参的名字进行指定传参

#5.4、默认值参数
# def f1(a='小明',b='小喝粥'): #定义函数时，给形参指定了默认值
#     print(f'a={a},b={b}')
# f1()                #不传递实参，形参就取默认值
# f1(a='123')         #传递实参，形参取实参的值
# f1(b='123')

#5.5、数量可变形参
    #在形参的名字前面添加*，可以让这个形参接受n多个实参
    #可变形参不能写在其它形参的前面
    #一个函数中只能有一个可变形参
# def f1(a='小明',b='小喝粥',*c):
#     print(f'a={a},b={b},c={c}')
# f1(111,222)         #传递了2个实参，可变参数c是一个空元组
# f1(111,222,333)     #传递了3个实参，可变参数c拥有1个元素
# f1(111,222,333,444,555,666)     #传递n个实参，第1个给a，第2个给b，多出来的全部给c组成元组

#练习：打印一个2*3的矩阵，再打印一个2*4的矩阵，再打印一个2*5的矩阵
# 1--1   1--2    1--3
# 2--1   2--2    2--3
# 1--1   1--2    1--3    1--4
# 2--1   2--2    2--3    2--4
# 1--1   1--2    1--3    1--4    1--5
# 2--1   2--2    2--3    2--4    2--5
def f1(a,b):
    for x in range(1,a+1):         #外循环x代表行数
        for y in range(1,b+1):     #内循环y代表每一行的列数
            print(f'{x}--{y}',end='\t')
        print()
f1(2,3)
f1(2,4)
f1(2,5)
f1(3,9)

#6、函数的返回值return
    #print()是将括号中的内容打印到控制台，给人看的，程序本身不需要print
    #None是空值的意思
    #函数没有return，它的结果就是None
    #函数有return，它的结果就是return后面的内容(与函数代码块中的操作，没有绝对关系)
def f1(a,b):
    s=a+b
def f2(a,b):
    s=a+b
    return 'hehe'
print(f1(5,8))
print(f2(5,8))


# 练习：有1个3位数n，它的3个位数之和是25，同时n+9的3个位数之和也是25，用代码找出这个数
#写一个函数，接受形参n，如果n的3个位数之和是9就返回True，否则返回False
# def f1(n):
#     a=int(str(n)[0])
#     b=int(str(n)[1])
#     c=int(str(n)[2])
#     if a+b+c==25:
#         return True
#     else:
#         return False
#遍历100-999，如果f1(n)和f1(n+9)都返回True，说明n就是要找的数字
# for i in range(100,999+1):
#     if f1(i)==True and f1(i+9)==True:
#         print(i)


#定义一个函数f1，接受形参year和month，返回'year年month月有day天'
    #例如f1(2025,2)，返回值是'2025年2月有28天'
    #例如f1(2024,2)，返回值是'2025年2月有29天'
# def f1(year,month):
#     day=[0,31,28,31,30,31,30,31,31,30,31,30,31]
#     if year%4==0 and year%100!=0 or year%400==0:
#         day[2]=29
#     return f'{year}年{month}月有{day[month]}天'
#
# print(f1(2025,2))
# print(f1(2024,2))
# print(f1(2025,1))
# print(f1(2025,12))

# # 编写一个函数，接受两个字符串作为参数，返回它们拼接后的结果，并在中间添加一个空格。
# def f1(a,b):
#     return str(a)+' '+str(b)
# print(f1(1,2))
# print(f1('aaa','bbb'))
# # 编写一个函数，接受任意数量的整数参数，返回这些数字中的最大值。
# def f2(*a):
#     return max(a)
# print(f2(2,4,2342,343,24,1235,23,5,3245325))